package server;
import java.io.Serializable;
import java.util.ArrayList;



/** Classe che gestisce l'oggetto di tipo Utente.
 *
 */
public class Utente implements Serializable {

	private static final long serialVersionUID = 1L;
	private String userID;
	private String password;
	private int token;
	private int rig, col;
	private Specie specie;
	private String nome_specie;
	private ArrayList<Specie> speciememo = new ArrayList<Specie>();
	private String[][] vistaMappa;
	
	/** Costruttore che crea un oggetto utente identificandolo tramite un nome ed una password.
	 * @param nome Nome dell'Utente.
	 * @param pass Password dell'Utente.
	 * @param k Numero di righe della Mappa
	 * @param z Numero di colonne della Mappa
	 */
	public Utente(String nome, String pass, int k, int z){
		
		this.userID = nome;
		this.password = pass;
		this.specie = null;
		this.token = -1;
		this.vistaMappa = new String[k][z];
		this.rig = k;
		this.col = z;
		setStartMap(k, z);
	}

	/** Metodo che restituisce l'oggetto di tipo Specie.
	 * @return E' l'oggetto di tipo Specie.
	 */
	public Specie getSpecie() {
		return specie;
	}

	/** Metodo che ritorna una stringa contentente l'ID dell'utente.
	 * @return ID dell'utente.
	 */
	public String getUserID() {
		return userID;
	}

	/** Metodo che ritorna un'ArrayList contenente le specie avute dall'Utente.
	 * @return ArrayList di Specie.
	 */
	public ArrayList<Specie> getSpecieMemo(){
		return this.speciememo;
	}
	
	/** Restituisce il Token associato all'Utente
	 * @return  Ritorna il Token dell'Utente
	 */
	public int getToken() {
		return this.token;
	}
	
	/** Metodo che inizializza il token dell'utente.
	 * @param t Token scelto dal metodo login in Partita.
	 */
	public void setToken(int t){
		this.token = t;
	}
	
	/** Metodo che ritorna una stringa contenente la password dell'Utente.
	 * @return Password dell'utente.
	 */
	public String getPassword() {
		return password;
	}

	/** Metodo che ritorna una stringa contenente il nome della Specie. 
	 * @return Nome della Specie.
	 */
	public String getNome_specie() {
		return nome_specie;
	}

	/** Restituisce al chiamante la variabile rappresentante la mappa personale dell'utente.
	 * @return Ritorna la Mappa vista dell'Utente.
	 */
	public String[][] getVistaMappa() {
		return vistaMappa;
	}

	/**Modifica della mappa personale del singolo utente.
	 * @param mappina Matrice rappresentante la mappa generale modificata secondo l'attuale vista dell'utente.
	 * @param startX Indica da quale riga partire.
	 * @param startY Indica da quale colonna partire.
	 * @param rig Indica per quante righe bisogna aggiornare la mappa dell'utente.
	 * @param col Indica per quante colonne bisogna aggiornare la mappa dell'utente.
	 * @uml.property  name="vistaMappa"
	 */
	public void setVistaMappa(String[][] mappina,int startX, int startY, int rig, int col){
		for(int i = 0; i < rig; i++){
			for(int j = 0; j < col; j++){
				vistaMappa[i + startX][j + startY] = mappina[i][j];
			}
		}	
	}

	/** Inizializza la mappa dell'utente.
	 * @param rig Numero di righe.
	 * @param col Numero di colonne.
	 */
	private void setStartMap(int rig, int col){
		for(int i = 0; i < rig; i++){
			for(int j = 0; j < col; j++){
				vistaMappa[i][j] = "b";
			}
		}
	}
	
	/** Metodo che crea una nuova Specie.
	 * @param nome Nome della Specie.
	 * @param tip Tipo della Specie.
	 */
	public void creaSpecie(String nome, String tip){
		
		setStartMap(this.rig, this.col);
		this.specie = new Specie(nome, this.userID, tip);
		this.speciememo.add(this.specie);
		this.nome_specie = nome;
	}
	
	/** Metodo che setta il punteggio dell'Utente.
	 * @param p Punteggio.
	 */
	public void setPunteggio(int p){
		specie.setPunteggio(p);
	}
	
	/** Metodo che gestisce l'estinzione della Specie corrente dell'Utente.
	 * 
	 */
	public void estinzione(){
		int indexSp = speciememo.indexOf(specie);
		speciememo.set(indexSp, new Specie(specie.getNomeSpecie(), specie.getUtente(), specie.getPunteggio(), specie.getEta()));
		this.specie = null;
	}
}
